﻿/** 表单扩展模块 date:2020-05-04   License By http://easyweb.vip */
layui.define(["form"], function (exports) {
    var jquery = layui.jquery;
    var form = layui.form;

    var tipMsg = {
        phoneX: "请输入正确的手机号",
        emailX: "邮箱格式不正确",
        urlX: "链接格式不正确",
        numberX: "只能填写数字",
        dateX: "日期格式不正确",
        identityX: "请输入正确的身份证号",
        psw: "密码必须5到12位，且不能出现空格",
        equalTo: "两次输入不一致",
        digits: "只能输入整数",
        digitsP: "只能输入正整数",
        digitsN: "只能输入负整数",
        digitsPZ: "只能输入正整数和0",
        digitsNZ: "只能输入负整数和0",
        minlength: "最少输入{minlength}个字符",
        maxlength: "最多输入{maxlength}个字符",
        min: "值不能小于{min}",
        max: "值不能大于{max}"
    };

    // phoneX、emailX等与layui自带phone、email等的区别是如果没有输入不会验证，输入了才验证格式。
    var verifyRules = {
        // 手机号
        phoneX: function (value, item) { //value：表单的值、item：表单的DOM对象
            var regExp = /^1\d{10}$/;
            if (value && !regExp.test(value)) {
                return tipMsg.phoneX
            }
        },
        // 邮箱
        emailX: function (value, item) {
            var regExp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
            if (value && !regExp.test(value)) {
                return tipMsg.emailX
            }
        },
        // 网址
        urlX: function (value, item) {
            var regExp = /(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/;
            if (value && !regExp.test(value)) {
                return tipMsg.urlX
            }
        },
        // 数字
        numberX: function (value, item) {
            if (value && isNaN(value)) {
                return tipMsg.numberX
            }
        },
        // 日期
        dateX: function (value, item) {
            var regExp = /^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/;
            if (value && !regExp.test(value)) {
                return tipMsg.dateX
            }
        },
        // 身份证
        identityX: function (value, item) {
            var regExp = /(^\d{15}$)|(^\d{17}(x|X|\d)$)/;
            if (value && !regExp.test(value)) {
                return tipMsg.identityX
            }
        },
        // 密码
        psw: function (value, item) {
            if (value && !/^[\S]{5,12}$/.test(value)) {
                return tipMsg.psw
            }
        },
        // 重复
        equalTo: function (value, item) {
            if (value != jquery(jquery(item).attr("lay-equalTo")).val()) {
                var text = jquery(item).attr("lay-equalToText");
                return text ? text : tipMsg.equalTo
            }
        },
        // 整数
        digits: function (value, item) {
            var regExp = /^-?\d+$/;
            if (value && !regExp.test(value)) {
                return tipMsg.digits
            }
        },
        // 正整数
        digitsP: function (value, item) {
            var regExp = /^[1-9]\d*$/;
            if (value && !regExp.test(value)) {
                return tipMsg.digitsP
            }
        },
        // 负整数
        digitsN: function (value, item) {
            var regExp = /^-[1-9]\d*$/;
            if (value && !regExp.test(value)) {
                return tipMsg.digitsN
            }
        },
        // 非负整数
        digitsPZ: function (value, item) {
            var regExp = /^\d+$/;
            if (value && !regExp.test(value)) {
                return tipMsg.digitsPZ
            }
        },
        // 非正整数
        digitsNZ: function (value, item) {
            var regExp = /^-[1-9]\d*|0/;
            if (value && !regExp.test(value)) {
                return tipMsg.digitsNZ
            }
        },
        // 兼容h5的规则
        h5: function (value, item) {
            if (value) {
                var minLength = jquery(item).attr("minlength");
                var maxLength = jquery(item).attr("maxlength");
                var min = jquery(item).attr("min");
                var max = jquery(item).attr("max");
                if (minLength && value.length < minLength) {
                    return tipMsg.minlength.replace(/{minlength}/g, minLength)
                }
                if (maxLength && value.length > maxLength) {
                    return tipMsg.maxlength.replace(/{maxlength}/g, maxLength)
                }
                if (min && value * 1 < min * 1) {
                    return tipMsg.min.replace(/{min}/g, min)
                }
                if (max && value * 1 > max * 1) {
                    return tipMsg.max.replace(/{max}/g, max)
                }
            }
        }
    };

    var formX = {
        init: function () {
            form.verify(verifyRules) // 添加自定义验证规则
        },

        formVal: function (filter, object) {
            formX.val(filter, object)
        },

        // 赋值表单，解决top.layui.form.val()无效bug
        val: function (filter, object) {
            jquery('.layui-form[lay-filter="' + filter + '"]').each(function () {
                var $this = jquery(this);
                for (var property in object) {
                    if (!object.hasOwnProperty(property)) {
                        continue
                    }
                    var itemElem = $this.find('[name="' + property + '"]');
                    if (itemElem.length > 0) {
                        var type = itemElem[0].type;
                        if (type === "checkbox") {
                            itemElem[0].checked = object[property]
                        } else {
                            if (type === "radio") {
                                itemElem.each(function () {
                                    if (this.value == object[property]) {
                                        this.checked = true
                                    }
                                })
                            } else {
                                itemElem.val(object[property])
                            }
                        }
                    }
                }
            });
            form.render(null, filter)
        },

        // 渲染select封装
        renderSelect: function (option) {
            var config = {
                elem: undefined,
                data: [],
                name: undefined,
                value: undefined,
                hint: "请选择",
                initValue: undefined,
                method: "get",
                where: undefined,
                headers: undefined,
                async: true,
                done: undefined,
                error: undefined
            };
            option = jquery.extend(config, option);
            if (typeof option.data === "string") {
                jquery.ajax({
                    url: option.data,
                    type: option.method,
                    data: option.where,
                    dataType: "json",
                    headers: option.header || option.headers,
                    async: option.async,
                    success: function (data, textStatus, jqXHR) {
                        if (data.data) {
                            option.data = data.data;
                            formX.renderSelect(option)
                        } else {
                            option.error && option.error(jqXHR, data)
                        }
                    },
                    error: option.error
                })
            } else {
                var selectOptions = option.hint ? ('<option value="">' + option.hint + "</option>") : "";
                for (var j = 0; j < option.data.length; j++) {
                    if (option.name && option.value) {
                        selectOptions += ('<option value="' + option.data[j][option.value] + '"' + (option.data[j][option.value] == option.initValue ? " selected" : "") + ">" + option.data[j][option.name] + "</option>")
                    } else {
                        selectOptions += ('<option value="' + option.data[j] + '"' + (option.data[j] == option.initValue ? " selected" : "") + ">" + option.data[j] + "</option>")
                    }
                }
                jquery(option.elem).html(selectOptions);
                var $layuiForm = jquery(option.elem).parent(".layui-form");
                if ($layuiForm.length === 0) {
                    $layuiForm = jquery(option.elem).parentsUntil(".layui-form").last().parent()
                }
                form.render("select", $layuiForm.attr("lay-filter"));
                option.done && option.done(option.data)
            }
        },

        // 按钮验证码倒计时封装
        startTimer: function (elem, time, format) {
            if (!time) {
                time = 60
            }
            if (!format) {
                format = function (time) {
                    return time + "s"
                }
            }
            if (formX.timers[elem]) {
                clearInterval(formX.timers[elem])
            }
            var html = jquery(elem).html();
            jquery(elem).html(format(time));
            jquery(elem).prop("disabled", true);
            jquery(elem).addClass("layui-btn-disabled");
            var timer = setInterval(function () {
                time--;
                if (time <= 0) {
                    clearInterval(timer);
                    jquery(elem).html(html);
                    jquery(elem).removeProp("disabled");
                    jquery(elem).removeClass("layui-btn-disabled")
                } else {
                    jquery(elem).html(format(time))
                }
            }, 1000);
            formX.timers[elem] = timer
        },

        timers: {}, // 保存所有定时器

        // 获取表单修改过的数据
        formUpdatedField: function (field, oldField) {

            if (typeof field == "string") {
                field = form.val(field)
            }

            for (var property in field) {
                if (!field.hasOwnProperty(property)) {
                    continue
                }
                if (field[property] === oldField[property]) {
                    delete field[property]
                }
            }
            if (Object.keys(field).length > 0) {
                return field
            }
        }
    };

    formX.init();
    exports("formX", formX)
});